package com.rabbiter.hospital.service.serviceImpl;

import com.rabbiter.hospital.mapper.ArrangeMapper;
import com.rabbiter.hospital.pojo.Arrange;
import com.rabbiter.hospital.service.ArrangeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.HashMap;
import java.util.List;

@Service("ArrangeService")
public class ArrangeServiceImpl implements ArrangeService {
    @Autowired
    private ArrangeMapper arrangeMapper;
    @Autowired
    private JedisPool jedisPool;//redis连接池

    /**
     * 根据日期查询排班信息
     * 该方法通过指定的日期和时间段，从数据库中查询对应的排班信息
     * @param arTime   排班日期，用于定位排班信息对应的日期
     * @param dSection 排班的时间段，用于区分不同的排班班次
     * @return 返回与给定日期和时间段相符的排班信息列表
     */
    @Override
    public List<Arrange> findByTime(String arTime, String dSection) {
        return this.arrangeMapper.findByTime(arTime, dSection);
    }

    /**
     * 增加排班信息
     * @param arrange 要添加的排班信息对象
     * @return 如果插入成功则返回true，否则返回false
     */
    public Boolean addArrange(Arrange arrange) {
        // 检查数据库中是否已存在相同的排班ID
        Arrange arrange1 = this.arrangeMapper.selectById(arrange.getArId());
        // 获取Redis连接
        Jedis jedis = jedisPool.getResource();
        // 初始化HashMap用于存储Redis中的数据
        HashMap<String, String> map = new HashMap<>();
        // 设置HashMap中的键值对，这些键值对代表不同的排班参数及其默认值
        map.put("eTOn", "40");
        map.put("nTOt", "40");
        map.put("tTOe", "40");
        map.put("fTOf", "40");
        map.put("fTOs", "40");
        map.put("sTOs", "40");
        // 如果在数据库中未找到相同的排班ID，则进行新增操作
        if (arrange1 == null) {
            // Redis操作开始
            // 将HashMap中的数据存储到Redis中，使用hmset设置整个哈希表的值
            jedis.hmset(arrange.getArId(), map);
            // 为Redis中的排班ID设置过期时间，以秒为单位
            jedis.expire(arrange.getArId(), 604800);
            // Redis操作结束
            // 插入排班信息到数据库中
            this.arrangeMapper.insert(arrange);
            // 插入成功，返回true
            return true;
        }
        // 如果数据库中已存在相同的排班ID，插入失败，返回false
        return false;
    }

    /**
     * 删除排班信息
     * 本方法通过接收排班标识符来删除相应的排班信息首先，它会根据排班标识符查询排班信息如果查询成功，
     * 将会在Redis中删除该排班信息对应的缓存，并在数据库中删除该排班信息记录如果查询不到指定的排班信息，
     * 则返回false表示删除失败返回true表示删除成功
     * @param arId 排班信息的唯一标识符
     * @return 如果删除成功，返回true；如果删除失败或找不到指定排班信息，返回false
     */
    public Boolean deleteArrange(String arId) {
        Arrange arrange = this.arrangeMapper.selectById(arId);
        Jedis jedis = jedisPool.getResource();
        if (arrange != null) {
            jedis.del(arId);
            this.arrangeMapper.deleteById(arId);
            return true;
        }
        return false;
    }

}
